package com.ai.javaailangchain4j.tools;

import com.ai.javaailangchain4j.entity.Appointment;
import com.ai.javaailangchain4j.service.AppointmentService;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class AppointmentTools {

    @Autowired
    private AppointmentService appointmentService;

    /**
     * 预约挂号
     * @param appointment
     * @return
     */
    @Tool(name = "预约挂号",value = "根据参数，先执行工具方法queryDepartment查询是否可预约，并直接给" +
            "用户回答是否可预约，并让用户确认所有预约信息，用户确认后再进行预约。如果用户没有提供具体的医生姓名，请从" +
            "向量存储中找到一位医生")
    public String bookAppointment(Appointment appointment){

//        查询数据库，查看是否存在符合条件的预约记录
        Appointment appointmentServiceOne = appointmentService.getOne(appointment);
        if (appointmentServiceOne==null){
//            说明没有预约信息
            appointment.setId(null);//防止大模型幻觉
            if (appointmentService.save(appointment)){
                return "预约成功";
            }
            else {
                return "预约失败";
            }
        }
        return "你好，您在相同的科室和时间已经预约过了";

    }


    /**
     * 取消预约
     * @param appointment
     * @return
     */
    @Tool(name = "取消预约",value = "用户取消预约，若存在预约记录则直接取消，成功返回ture，否则返回false")
    public String cancelAppointment(Appointment appointment){
//        查看数据库看是否存在预约记录
        Appointment appointmentServiceOne = appointmentService.getOne(appointment);
        if (appointmentServiceOne!=null){
//            记录不存在
            if (appointmentService.removeById(appointmentServiceOne.getId())){
                return "预约取消成功";
            }else {
                return "预约取消失败";
            }
        }
        return "未预约过";
    }

    @Tool(name="查询是否有号源",value = "根据科名称，日期，时间，和医生查询是否有号源，然后返回给用户")
            public boolean  queryDepartment(
         @P(value = "科室名称")String name,
         @P(value = "预约日期")String date,
         @P(value = "预约时间")String time,
         @P(value = "医生名称",required = false)String doctor
    ){
        System.out.println("查询是否有号源");
        System.out.println("科室名称："+name);
        System.out.println("日期：" + date);
        System.out.println("时间："+time);
        System.out.println("医生名称："+doctor);

//        TODO:维护医生的排班信息
//        如果没有指定医生名称，则根据其他条件查询符合条件的可预约的医生(存在则返回true，不存在则返回false)

//        如果指定了医生名称，则查询医生是否有排班（没有排班返回false）
//        如果有排班，判断医生排班时间段是否已经约满（约满返回false，有空闲返回true）

        return true;
    }
}
